﻿using AhpilyServer;
using PokerServer.Cache;
using PokerServer.Model;
using Protocol.Code;
using Protocol.Dto;

namespace PokerServer.Logic
{
    /// <summary>
    /// 用户逻辑处理层
    /// </summary>
    public class UserHandler : IHandler
    {
        private readonly UserCache userCache = Caches.User;
        private readonly AccountCache accountCache = Caches.Account;

        public void OnDisconnect(ClientPeer client)
        {
            if (userCache.IsOnline(client))
            {
                userCache.Offline(client);
            }
        }

        public void OnReceive(ClientPeer client, int subCode, object value)
        {
            switch (subCode)
            {
                case UserCode.CREAT_CREQ:
                    Create(client, value.ToString());
                    break;
                case UserCode.Get_INFO_CREQ:
                    getInfo(client);
                    break;
                case UserCode.ONLINE_CREQ:
                    online(client);
                    break;
            }
        }

        /// <summary>
        /// 创建角色
        /// </summary>
        /// <param name="client"></param>
        /// <param name="name"></param>
        private void Create(ClientPeer client, string name)
        {
            SingleExecute.Instance.Execute(
                delegate
                {
                    // 判断是否这个客户端是否非法登录
                    if (!accountCache.IsOnline(client))
                    {
                        client.Send(OpCode.USER, UserCode.CREAT_SRES, -1); // 非法登录
                        return;
                    }

                    // 获取账号Id
                    int accountId = accountCache.GetId(client);

                    // 判断一下 这个账号有没有角色
                    if (userCache.IsExit(accountId))
                    {
                        client.Send(OpCode.USER, UserCode.CREAT_SRES, -2); // 重复创建
                        return;
                    }

                    // 没有问题，可以创建角色
                    userCache.Create(name, accountId);
                    client.Send(OpCode.USER, UserCode.CREAT_SRES, 0); // 重复创建
                });
        }

        /// <summary>
        /// 获取角色信息
        /// </summary>
        /// <param name="client"></param>
        private void getInfo(ClientPeer client)
        {
            SingleExecute.Instance.Execute(
                delegate
                {
                    // 判断这个客户端是否非法登录
                    if (!accountCache.IsOnline(client))
                    {
                        client.Send(OpCode.USER, UserCode.Get_INFO_SRES, null); // 非法登录
                        return;
                    }

                    int accountId = accountCache.GetId(client);


                    // 第一次登录应该走这个分支
                    if (userCache.IsExit(accountId) == false)
                    {
                        client.Send(OpCode.USER, UserCode.Get_INFO_SRES, null); // "没有角色
                        return;
                    }
                    //
                    // // 防止二次登录服务器出现数据异常
                    // // 存在角色直接上线
                    // if (userCache.IsOnline(client) == false)
                    // {
                    //     online(client);
                    // }

                    UserModel model = userCache.GetModelByAccountId(accountId);
                    UserDto dto = new UserDto(model.Id, model.Name, model.Bean, model.WinCount, model.LoseCount,
                        model.RunCount, model.Lv, model.Exp);
                    client.Send(OpCode.USER, UserCode.Get_INFO_SRES, dto); // 获取成功
                });
        }

        /// <summary>
        /// 角色上线
        /// </summary>
        /// <param name="client"></param>
        private void online(ClientPeer client)
        {
            SingleExecute.Instance.Execute(
                delegate
                {
                    // 判断这个客户端是否非法登录
                    if (!accountCache.IsOnline(client))
                    {
                        client.Send(OpCode.USER, UserCode.ONLINE_SRES, -1); // 非法登录
                        return;
                    }

                    int accountId = accountCache.GetId(client);

                    if (userCache.IsExit(accountId) == false)
                    {
                        client.Send(OpCode.USER, UserCode.ONLINE_SRES, -2); // 没有角色 不能上线
                        return;
                    }


                    // 防止二次登录服务器出现数据异常
                    // 存在角色直接上线
                    if (userCache.IsOnline(client))
                    {
                        client.Send(OpCode.USER, UserCode.ONLINE_SRES, -3); // 已经在线了
                    }

                    int userId = userCache.GetId(accountId);

                    userCache.Online(client, userId);

                    client.Send(OpCode.USER, UserCode.ONLINE_SRES, 0); // 上线成功
                });
        }
    }
}